public class StaticLearn {
    //static成员
    public static void main(String[] args) {
        Student s1 = new Student("zhangsan",20,"男",4.0);
        Student s2 = new Student("lisi",18,"女",2.5);
        Student s3 = new Student("wangwu",19,"男",3.0);

        //假设三个同学都在一个教师上课，既然在同一个教师，能否给类里面再加一个成员变量，保存同学们上课的教室？
        //Student类中定义的成员变量，每个对象中都会包含一份，因为需要使用那些信息来描述具体的学生，而现在表示学生要上课的教室
        //这个教室的属性并不需要每个学生对象都存储一份，而是需要让所有的学生共享。
        //Java中，被static修饰的成员，称之为静态成员，也称类成员，并不属于某个具体的对象，而是所有对象所共享的

        //static修饰成员变量，称为静态成员变量，
        // 特性：
        // 1.不依赖于某个具体的对象，不属于某个具体的对象，是所有对象所共享的
        // 2.通过类名进行访问
        // 3.存储在方法区中
        // 4.生命周期伴随类的一生

        //System.out.println(Student.classRome);//可以通过类名直接访问
        //调试监视窗口发现，静态成员变量并没有存储到某个具体的对象中，它是所有对象所共有的

        //一般类中的数据成员都设置为private，成员方法设置为public，那如果将其设置为private，student中的classRoom属性如何在类外访问呢？
//        System.out.println(Student.classRome);//err java: classRome 在 Student 中是 private 访问控制

        //Java中，被static修饰的成员方法称为静态成员方法，是类的方法，不是某个对象所特有的。
        //静态成员一般是通过静态方法来访问的
//        System.out.println(Student.getClassRome());
        //静态方法的特性：
        //1.不属于某个具体的对象的方法，是类方法
        //2.不能在静态方法中直接访问任何非静态成员变量/方法
        //同时，也不能在静态方法中使用this

        //静态成员变量一般不会放在构造方法中初始化，构造方法中初始化的是于对象有关的实例属性
        //静态成员变量的初始化分为两种
        //1.就地初始化
        //2.静态代码块初始化

        //就地初始化：在定义的时候就给出初始值

        //静态代码初始化：
        //牵扯出了代码块的知识


        //代码块：使用{}定义的一段代码称为代码块，根据代码块的定义的位置和关键字，又可分为一下四种
        //1.普通代码块
        //2.构造快
        //3.静态块

        //普通代码块
        //就是在方法中的代码块

//        {
//            int x = 10;
//            System.out.println("x = " + x);
//        }
//        int x = 10;
//        System.out.println("x = " + x);

        //构造代码块：定义在类里面，方法外面的代码块（不加修饰符），也叫实例代码块，一般用于初始化实例成员变量
//        Student s = new Student();
//        System.out.println(s.name);

        //静态代码块
        //使用static定义的代码块称为静态代码块，一般用于初始化静态成员变量
//        Student s = new Student();
//        System.out.println();

        //1.静态代码块不管生成多少个对象，只会执行一次
        //2.静态成员变量是类的属性，在JVM加载类时开辟空间初始化的
        //3.如果一个类中包含多个静态代码块，编译代码时候，会按照定义的先后顺序合并依次执行
        //4.实例化代码只有在创建对象的时候才会执行
        //执行顺序 1 静态代码块（只要类被加载，就会被执行） 2 实例代码块（在创建对象的时候才会执行） 3.不带参数的构造方法


    }


}
